package org.cmcc.pcap.packet.tcp.tcp;


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.cmcc.pcap.packet.dataObtian.ResolveDataObtain;
import org.cmcc.pcap.packet.tcp.TcpConnection;
import org.cmcc.pcap.packet.tcp.TcpProtocolHandler;

import java.util.Date;
import java.util.HashMap;

/**
 * @author Amish
 * @Date 2018年3月21日 上午10:06:33
 */
public class TcpHandler extends TcpProtocolHandler {

    private static Logger logger = LogManager.getLogger(TcpHandler.class);


    public TcpHandler() {

    }

    @Override
    public synchronized void handle(TcpConnection tcpConnection,String taskId) {

        tcpConnection.tcpConnectionPacketsDeal();

        logger.debug("start execute tcp packet handler");

        logger.debug(new Date(tcpConnection.lastPacketTime));//最后一个packet的处理时间(注:非抓包时间)

        ResolveDataObtain resolveDataObtain = ResolveDataObtain.getResolveDataObtain();
        HashMap<Object, Object> hashMap = new HashMap<>();
        hashMap.put("srcPort",tcpConnection.reassembleAl.get(0).tcpPacket.getHeader().getSrcPort());
        resolveDataObtain.saveData(hashMap);

        /**
         * Connection 内TCP 分段(segment)处理：乱序重组、重传清洗、TODO 默认保留前2个分段且可配？
         */
/*		
		logger.debug("dpid tcp connection deal");
		tcpConnection.tcpConnectionPacketsDeal();//duplicate ack merge、retransmission and spurious retransmission merge、segments reassemble
		logger.debug("stop tcp connection deal");
		
		logger.debug("this connection <"+tcpConnection.connectionKey+"> hava packets (initial)  : "+tcpConnection.packetsNumInitial);
		logger.debug("this connection <"+tcpConnection.connectionKey+"> hava packets (after duplicate ack merge)  : "+tcpConnection.packetsNumAfterDuplicateAckMerge);
		logger.debug("this connection <"+tcpConnection.connectionKey+"> hava packets (after retransmission merge)  : "+tcpConnection.packetsNumAfterRetransmissionMerge);
		logger.debug("this connection <"+tcpConnection.connectionKey+"> hava packets (after reorder packets)  : "+tcpConnection.packetsNumAfterReorderTcpPacket);
		logger.debug("this connection <"+tcpConnection.connectionKey+"> hava packets (after reassemble) : "+tcpConnection.packetsNumAfterReassemble);
*/

//		for(TcpPacketDecorator tpd : tcpConnection.al){
//			logger.error("-----------------------------------");
//			logger.error(new String(tpd.getData()));
//			logger.error("-----------------------------------");
//		}
//		for(TcpPacketDecorator tpd : tcpConnection.retransmissionMergeAl){
//			logger.error("++++++++++++++++++++++++++++++++++++");
//			logger.error(new String(tpd.getData()));
//			logger.error("++++++++++++++++++++++++++++++++++++");
//		}
//		for(TcpPacketDecorator tpd : tcpConnection.reassembleAl){
//			logger.error("====================================");
//			logger.error(new String(tpd.getData()));
//			logger.error("====================================");
//		}


        /**
         * TODO HTTP事务识别：按HTTP事务重新对TcpConnection进行划分成多个TcpConnection
         * 握手信息放在第一个HTTP事务中
         * 拆链信息放在最后一个HTTP事务中
         */


    }

}
